package com.netty.simple;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
 * @Author 咕唧
 * @Date 2022/7/7 19:53
 * @Version 1.0
 */
public class NettyServer {
    public static void main(String[] args) {
        //创建一个服务端
        ServerBootstrap serverBootStrap = new ServerBootstrap();
        //设置线程池相关的东西
        NioEventLoopGroup parent = new NioEventLoopGroup();
        NioEventLoopGroup child = new NioEventLoopGroup();
        serverBootStrap
                //设置线程组，用于处理请求的
                .group(parent, child)
                //设置通道，因为使用的是nio，所以通道类型也是nio类型的服务通道
                .channel(NioServerSocketChannel.class)
                //TCP
                .option(ChannelOption.SO_BACKLOG, 128)
                //netty只管处理请求的基本内容,但是到底如何处理我们的数据是需要我们自己来做的
                .childHandler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    protected void initChannel(SocketChannel ch) throws Exception {
                        //添加具体的处理者
                        ch.pipeline().addLast(new NettyServerHandler());
                    }
                });
        try {
            //绑定一个端口号
            ChannelFuture channelFuture = serverBootStrap.bind(12345).sync();
            //通过监听判断端口是否绑定成功
            channelFuture.addListener(future -> {
                if (future.isSuccess()) {
                    System.out.println("服务端启动成功");
                }else {
                    System.out.println("服务端启动失败");
                }
            });
            //当所有的通道关闭后，我们需要结束服务端，释放一些资源,在不关闭之前，一直处于阻塞状态
            channelFuture.channel().closeFuture().sync();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            parent.shutdownGracefully();
            child.shutdownGracefully();
        }
    }
}
